//package com.by.service.impl;
//
//import com.by.bean.CartInfo;
//import com.by.bean.ShopCart;
//import com.by.bean.ShopCartItem;
//
//import com.by.mapper.ShopCartItemMapper;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.by.service.ShopCartItemService;
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import org.springframework.beans.factory.annotation.Autowired;
//
//import org.springframework.data.redis.core.RedisTemplate;
//
//import org.springframework.stereotype.Service;
//
//
//import java.util.ArrayList;
//
//
///**
// * 先操作逻辑 在操作redis
// */
//
///**
// * <p>
// * 购物车 服务实现类
// * </p>
// *
// * @author wyh
// * @since 2025-04-14
// */
//@Service
//public class 先逻辑ShopCartItemServiceImpl extends ServiceImpl<ShopCartItemMapper, ShopCartItem> implements ShopCartItemService {
//
////    购物车存储的key
//    private static final String CART_KEY = "ShoppingCart_hash_key";
////    购物车存储的key的前缀
//    private static final String CART_FIELD_PREFIX = "ShoppingCart:userid:";
//
//    @Autowired
//    private RedisTemplate<String, Object> redisTemplate;
//
//
//    @Autowired
//    private ObjectMapper objectMapper;
//
//
//
//    /**
//     * 添加商品到购物车---从商品界面添加到购物车
//     * @param cartItem 购物车项
//     */
//    @Override
//    public int addToCart(ShopCartItem cartItem) {
////        hash结构存储 key为CART_KEY 是购物车的hash结构，
////        field为CART_FIELD_PREFIX+userId 是用户购物车的唯一标识符
//        //        value为购物车对象，json格式
//        String cartField = CART_FIELD_PREFIX + cartItem.getUserId();
//        //根据用户id获取用户购物车数据
//        ShopCart cart = getCart(cartItem.getUserId());
//        if (cart == null) {
//            cart = new ShopCart();
//            cart.setUserId(cartItem.getUserId());
//            cart.setItems(new ArrayList<>());
//            cart.setTotalAmount(0L);
//        }
//        // 查找商品是否已存在于购物车
//        //cart.getItems().stream()获取购物车的购物车列表，列表转换为一个流
//        //item 是ShopCart中的每个ShopCartItem对象
//        //item.getSkuId()获取是ShopCart中的每个ShopCartItem对象商品id与新增的购物车项中的商品id进行比较
//        //.findFirst() 方法返回过滤后的第一个元素。如果没有任何 ShopCartItem 对象满足过滤条件，则返回一个空的 Optional<ShopCartItem>。
//        //.orElse(null) 方法表示如果 Optional 中没有值，则返回 null。
//        ShopCartItem existItem = cart.getItems().stream()
//                .filter(item -> item.getSkuId().equals(cartItem.getSkuId()))
//                .findFirst()
//                .orElse(null);
////        exisItem 表示的为购物车中所有的购物车项
//        if (existItem != null) {
//            // 更新现有商品数量
//            existItem.setCount(existItem.getCount()+cartItem.getCount());
////             更新现有商品总价 现有商品数量*现有商品单价
//            existItem.setTotalFee(existItem.getCount()*existItem.getPriceFee());
//        }else {
//            // 添加新商品
//            ShopCartItem newItem = new ShopCartItem();
//            newItem.setSkuId(cartItem.getSkuId());
//            newItem.setCount(cartItem.getCount());
//            newItem.setPriceFee(cartItem.getPriceFee());
//            newItem.setShopId(cartItem.getShopId());
//            newItem.setSpuId(cartItem.getSpuId());
//            newItem.setUserId(cartItem.getUserId());
//            newItem.setSkuName(cartItem.getSkuName());
//            newItem.setSkuImg(cartItem.getSkuImg());
//            newItem.setSkuSpec(cartItem.getSkuSpec());
//            newItem.setTotalFee(cartItem.getTotalFee());
////            把新增的商品添加到购物车列表中
//            cart.getItems().add(newItem);
//        }
////        根据传入的购物车项计算总价
//        updateTotalAmount(cart);
//
//
//        // 保存到Redis
//        try {
//            // 将购物车对象转换为 JSON 字符串
//            // CAR_KEY 字符串常量 购物车存储的key
//            // cartField这是一个字符串，表示购物车的唯一标识符。通常由 CART_KEY_PREFIX + userId 组成，例如 "shopcart:123"
//            // cartJson 购物车对象转换为 JSON 字符串
//            String cartJson = objectMapper.writeValueAsString(cart);
//            redisTemplate.opsForHash().put(CART_KEY, cartField, cartJson);
//        } catch (JsonProcessingException e) {
//            throw new RuntimeException("无法将购物车信息保存到 Redis 数据库中", e);
//        }
//        return 1;
//    }
//
//    /**
//     * 获取用户购物车数据
//     * @param userId     用户id
//     * @return
//     */
//    @Override
//    public ShopCart getCart(Long userId) {
////        用户购物车存储的key
//        String cartField = CART_FIELD_PREFIX + userId;
//       //获取用户购物车数据
//        Object cartJson = redisTemplate.opsForHash().get(CART_KEY, cartField);
//        if (cartJson == null) {
//            return null;
//        }
//        try {
//            // 将 JSON 字符串转换为购物车对象
//            return objectMapper.readValue(cartJson.toString(), ShopCart.class);
//        } catch (JsonProcessingException e) {
//            throw new RuntimeException("无法从 Redis 解析 cart",e);
//        }
//    }
//
//    /**
//     * 删除购物车中的商品
//     * @param userId
//     * @param skuId
//     * @return
//     */
//    @Override
//    public int deleteItem(Long userId, Long skuId) {
////根据用户id获取用户购物车数据
//        ShopCart cart = getCart(userId);
//        if (cart != null) {
//            //        如果购物车中的该商品数量>1，移除该商品
//            String cartField = CART_FIELD_PREFIX + userId;
//            if (cart.getItems().size()>1){
//
////        removeIf() 方法用于从列表中删除满足给定条件的元素。
//                cart.getItems().removeIf( item -> item.getSkuId().equals(skuId));
//                updateTotalAmount(cart);
//                // 保存到Redis
//                String cartJson = null;
//                try {
//                    // 将购物车对象转换为 JSON 字符串
//                    cartJson = objectMapper.writeValueAsString(cart);
//                    // 更新Redis中的购物车数据
//                    redisTemplate.opsForHash().put(CART_KEY, cartField, cartJson);
//                } catch (JsonProcessingException e) {
//                    throw new RuntimeException("无法将删除购物车信息更新到 Redis 数据库中",e);
//                }
//
//
//            }else {
//                //如果购物车中的该商品数量=1，移除购物车
//                redisTemplate.opsForHash().delete(CART_KEY, cartField);
//            }
//
//            return 1;
//        }
//        return 0;
//    }
//
//    /**
//     * 减少购物车中的商品数量
//     * @param userId
//     * @param skuId
//     * @return
//     */
//    @Override
//    public int decrToCartCount(Long userId, Long skuId) {
////根据用户id获取用户购物车数据
//        ShopCart cart = getCart(userId);
//        if (cart == null) {
//            return 0;
//        }
//
////        根据skuId删除购物车中的商品
//        // 查找要删除的商品项
//        ShopCartItem itemToRemove = null;
//        for (ShopCartItem item : cart.getItems()) {
//            if (item.getSkuId().equals(skuId)) {
//                itemToRemove = item;
//                break;
//            }
//        }
//        if(itemToRemove!=null){
//            //如果购物车中的该商品数量>1，则该商品的数量-1
//            if (itemToRemove.getCount() > 1){
//                itemToRemove.setCount(itemToRemove.getCount() - 1);
//            }else {
//                //如果购物车中的该商品数量=1，则直接删除该商品
//                cart.getItems().remove(itemToRemove);
//            }
//            //修改完判断 购物车是否为空，如果为空，则移除购物车
//            if (cart.getItems().isEmpty()){
//                // 移除整个购物车
//                String cartField = CART_FIELD_PREFIX + userId;
//                redisTemplate.opsForHash().delete(CART_KEY, cartField);
//
//                return 1; // 表示成功删除了一个商品，并且购物车为空
//            }
//            // 更新购物车总金额
//            updateTotalAmount(cart);
//            String cartField = CART_FIELD_PREFIX + userId;
//            // 保存到Redis
//            try {
//                String cartJson = objectMapper.writeValueAsString(cart);
//                redisTemplate.opsForHash().put(CART_KEY, cartField, cartJson);
//            } catch (JsonProcessingException e) {
//                throw new RuntimeException("更新购物车失败", e);
//            }
//            return 1; // 表示成功删除了一个商品
//        }
//        return 0; // 表示没有找到要删除的商品
//    }
//
//    /**
//     * 清空购物车
//     * @param userId
//     */
//    @Override
//    public int clearCart(Long userId) {
////根据用户id获取用户购物车数据
//        ShopCart cart = getCart(userId);
//        if (cart != null) {
//            return 0;
//        }
//        String cartField = CART_FIELD_PREFIX + userId;
//        redisTemplate.opsForHash().delete(CART_KEY, cartField);
//        return 1;
//    }
//
//    /**
//     * 添加购物车商品数量
//     * @param userId
//     * @param skuId
//     * @return
//     */
//    @Override
//    public int incrToCartCount(Long userId, Long skuId) {
//        String cartField = CART_FIELD_PREFIX + userId;
//        //根据用户id获取用户购物车数据
//        ShopCart cart = getCart(userId);
//        if (cart == null) {
//            return 0;
//        }
//        //根据skuId查找购物车中的商品 并且实现数量+1
//        ShopCartItem item = new ShopCartItem();
//        for (ShopCartItem cartItem : cart.getItems()) {
//            if (cartItem.getSkuId().equals(skuId)) {
//                item = cartItem;
//                break;
//            }
//        }
//        if (item == null) {
//            return 0;
//        }
//        item.setCount(item.getCount() + 1);
//        updateTotalAmount(cart);
//        // 保存到Redis
//        try {
//            String cartJson = objectMapper.writeValueAsString(cart);
//            redisTemplate.opsForHash().put(CART_KEY, cartField, cartJson);
//        } catch (JsonProcessingException e) {
//            throw new RuntimeException("增加数量失败", e);
//        }
//        return 1;
//    }
//
//    @Override
//    public CartInfo getCartInfo(Long userId) {
//        return null;
//    }
//
//
//
//    @Override
//    public void checkItem(Long userId, Long skuId, Boolean checked) {
//
//    }
//
//
//    @Override
//    public Integer getCartCount(Long userId) {
//        return 0;
//    }
//
//    @Override
//    public void mergeCart(Long userId, String tempCartKey) {
//
//    }
//
//    /**
//     * 更新购物车总金额
//     * @param cart
//     */
//    public void updateTotalAmount(ShopCart cart) {
//        long sum = 0;
//        for (ShopCartItem item : cart.getItems()){
//            sum += item.getTotalFee();
//        }
//        cart.setTotalAmount(sum);
//    }
//
//}
